package cm.tl.pms.sys.listener;


import cm.tl.pms.sys.pojo.ImportUserDto;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 这是自定义的监听器
 */
// 有个很重要的点 DemoDataListener 不能被spring管理，要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class ExpressExcelUserListen implements ReadListener<ImportUserDto> {

    /**
     * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 100;
    /**
     * 缓存的数据
     */
    private Set<String> set = new HashSet<>();
    private List<String> errorList = new ArrayList<>();
    private List<ImportUserDto> dataList = new ArrayList<>();

    public int count;

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param exportTmp one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(ImportUserDto exportTmp, AnalysisContext context) {
        log.info(" 进入了---------------- invoke");
        log.info("解析到一条数据:{}", exportTmp);
        // 获取当前行号
        int currentRowNum = context.readRowHolder().getRowIndex();
        log.info("当前行号：" + currentRowNum);

        if (StringUtils.isBlank(exportTmp.getUserName())) {
            String msg = "第" + currentRowNum + "行：用户名称 为空 ";
            errorList.add(msg);
//        }else if(StringUtils.isBlank(exportTmp.getDeptName()) || StringUtils.isBlank(exportTmp.getRoleIds()) ){
        }/*else if(StringUtils.isBlank(exportTmp.getDeptName())  ){
            String msg= "第" + currentRowNum + "行：部门名称 为空 ";
            errorList.add(msg);
        }*/ else {
            dataList.add(exportTmp);
            set.add(currentRowNum + "");
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        saveData();
        log.info("所有数据解析完成！");
    }

    @Override
    public boolean hasNext(AnalysisContext analysisContext) {
        return true;
    }

    @Override
    public void onException(Exception e, AnalysisContext analysisContext) throws Exception {
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        log.info("{}条数据，开始存储数据库！", set.size());

    }

    public int getCount() {
        return count;
    }

    public List<ImportUserDto> getDataList() {
        return dataList;
    }

    public List<String> getErrorList() {
        return errorList;
    }
}
